package com.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Map;

import org.apache.commons.io.FileUtils;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreemarkerUtil {
	/**
	* 获取模板
	* @param fltName
	* @return
	*/
	private Template getTemplate(String fltName) {
		try {
			//通过Freemaker的Configuration读取相应的ftl
			File fltFile = new File(fltName);
			Configuration cfg = new Configuration();
			//设定去哪里读取相应的ftl模板文件
			cfg.setDirectoryForTemplateLoading(new File(fltFile.getParent()));
			//在模板文件目录中找到名称为name的文件,按预定的编码
			Template temp = cfg.getTemplate(fltFile.getName(),ConfigConts.CNS_ENCODE);
			System.out.println("-------------ftl encode--"+temp.getEncoding());
			return temp;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	* 输出到控制台
	* @param name 模板文件名
	* @param root
	*/
	public void print(String name,Map<String,Object> root) {
		try {
			//通过Template可以将模板文件输出到相应的流
			Template temp = this.getTemplate(name);
			temp.process(root, new PrintWriter(System.out));
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	* 输出到文件
	* @param fltFile
	* @param root
	* @param outFile
	*/
	public void fprint(String fltFile,Map<String,
	Object> root,String outFile) {
		OutputStreamWriter out = null;
		File outputFile = null;
		try {
			//通过一个文件输出流，就可以写到相应的文件中
			outputFile = new File(outFile);
//			FileUtils.openOutputStream(outputFile);
//			out = new OutputStreamWriter(new FileOutputStream(outputFile),ConfigConts.CNS_ENCODE);
			out = new OutputStreamWriter(FileUtils.openOutputStream(outputFile),ConfigConts.CNS_ENCODE);
			
			Template temp = this.getTemplate(fltFile);
//			temp.setEncoding(encoding)
			temp.process(root, out);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				if(out!=null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

